home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d3 / dbsteel3.arc / SORTSTR.BAS < prev    next >
BASIC Source File  |  1991-01-21  |  11KB  |  426 lines

  1. 3 ON ERROR GOTO 64200
  2. 4 DEFINT K,F,T,L,R,N
  3. 5 DIM K$(55)
  4. 6 DIM FLDN$(1,60),FTY(1,60),FL(1,60)
  5. 7 DEFSTR X,P
  6. 8 DIM X(4200),T(4200),NREC(17),FD(3),Z$(60),L(100),R(100),F$(17)
  7. 10 MAXR= 6
  8. 12 GOSUB 8000
  9. 15 GOSUB 13000
  10. 16 H = A
  11. 17 GOSUB 7000
  12. 19 DEFSTR Z
  13. 20 A = H
  14. 25 GOSUB 9000
  15. 30 FLG = 0
  16. 45 L = 0
  17. 50 FOR T = 1 TO NREC(A)
  18. 55 L = L + FL(A,T)
  19. 60 NEXT T
  20. 70 DEFINT T
  21. 90 GOSUB 11000
  22. 100 GOSUB 10000
  23. 400 REM ******  GET DATA FROM DISKS  *******
  24. 405 GOSUB 16000
  25. 420 FOR T = 1 TO 30000 
  26. 429 IF T > MRN GOTO 26000
  27. 430 GET #1,T
  28. 435 N = FD(1)
  29. 500 LET X(T) = Z$(N)
  30. 705 T(T) = T
  31. 710 NEXT T
  32. 1200 LP = 1   
  33. 1210 FLG = 0
  34. 2000 REM
  35. 2010 M = 5000
  36. 2020 GOSUB 30000
  37. 2110 GOSUB 2200
  38. 2120 GOSUB 30000
  39. 2130 GOTO 3000
  40. 2200 REM
  41. 2210 L(1) = 1 
  42. 2220 R(1) = MAXR
  43. 2230 S = 1
  44. 2240 IF (L(S)) < R(S) THEN 2270
  45. 2250    S = S - 1
  46. 2260    GOTO 2640
  47. 2270 I = L(S)
  48. 2280 J = R(S)
  49. 2290 P1= X(J)
  50. 2300 M = (I + J)/2
  51. 2310 IF (J - I<6) THEN 2400
  52. 2320 IF ((P1>X(I)) AND (P1<X(M))) THEN 2400
  53. 2330 IF ((P1<X(I)) AND (P1>X(M))) THEN 2400
  54. 2340 IF ((X(I)<X(M)) AND (X(I)>P1)) THEN 2380
  55. 2350 IF ((X(I)>X(M)) AND (X(I)<P1)) THEN 2380
  56. 2360 SWAP X(M),X(J)
  57. 2365 SWAP T(M),T(J)
  58. 2370 GOTO 2390
  59. 2380 SWAP X(I),X(J)
  60. 2385 SWAP T(I),T(J)
  61. 2390 P1 = X(J)
  62. 2400 WHILE (I<J)          
  63. 2410 WHILE (X(I)< P1)   
  64. 2420 I = I + 1
  65. 2430 WEND     
  66. 2440 J=J-1
  67. 2450 WHILE  (I<J)AND(P1<X(J))  
  68. 2460 J = J-1
  69. 2470 WEND     
  70. 2480 IF (I>=J) THEN 2510
  71. 2490 SWAP X(I),X(J)
  72. 2500 SWAP T(I),T(J)
  73. 2510 WEND      
  74. 2520 J = R(S)
  75. 2530 SWAP X(I),X(J)
  76. 2540 SWAP T(I),T(J)
  77. 2550 IF (I - L(S)>=R(S)-I) THEN 2600
  78. 2560    L(S + 1) = L(S)
  79. 2570    R(S + 1) = I - 1
  80. 2580    L(S) = I + 1
  81. 2590    GOTO 2630
  82. 2600    L(S + 1) = I + 1
  83. 2610    R(S + 1) = R(S)
  84. 2620    R(S) = I - 1 
  85. 2630 S = S + 1
  86. 2640 IF (S > 0) THEN 2240
  87. 2650 RETURN
  88. 3000 REM ********  PUT IN FILE ************
  89. 3100 GOSUB 9100
  90. 3110 Q$ = "B:"+F$(A)
  91. 3200 GOSUB 9200
  92. 3300 FOR Q = 1 TO MAXR
  93. 3310 RN = T(Q)
  94. 3312 GET #1,RN
  95. 3330 LSET Z1$ = Y$
  96. 3340 PUT #2,Q
  97. 3350 NEXT Q
  98. 3500 CLOSE
  99. 3600 GOSUB 15000
  100. 3620 PRINT "SORT FINISHED "
  101. 3630 END
  102. 7000 GOSUB 12000
  103. 7005 OPEN "I",#1,"FFILE"
  104. 7010 INPUT #1,MAXF
  105. 7020 FOR A = 1 TO MAXF
  106. 7030 INPUT #1,A,F$(A),NREC(A),L(A)
  107. 7040 FOR N = 1 TO NREC(A)
  108. 7050 INPUT #1,FLDN$(1,N),FTY(1,N),FL(1,N)
  109. 7055 IF FTY(1,N) = 2 THEN INPUT #1,KY,KEYLIST
  110. 7060 NEXT N
  111. 7065 IF A = AHLD THEN RETURN
  112. 7070 NEXT A
  113. 7080 CLOSE #1
  114. 7100 RETURN
  115. 8000 GOSUB 12000
  116. 8005 OPEN "I",#1,"FFILE"
  117. 8010 INPUT #1,MAXF
  118. 8020 FOR A = 1 TO MAXF
  119. 8030 INPUT #1,A,F$(A),NREC(A),L(A)
  120. 8040 FOR N = 1 TO NREC(A)
  121. 8050 INPUT #1,FLDN$(1,N),FTY(1,N),FL(1,N)
  122. 8055 IF FTY(1,N) = 2 THEN INPUT #1,KY,KEYLIST
  123. 8060 NEXT N
  124. 8070 NEXT A
  125. 8080 CLOSE #1
  126. 8100 RETURN
  127. 9000 REM *******  OPEN FILE SUBROUTINE  *******
  128. 9010 CLOSE #1
  129. 9020 OPEN "R",#1,F$(A),L(A)
  130. 9030 D = 0
  131. 9040 FOR T = 1 TO NREC(A)
  132. 9050 FIELD #1,D AS D$,FL(1,T) AS Z$(T)
  133. 9060 D = D + FL(1,T)
  134. 9070 NEXT T
  135. 9080 RETURN
  136. 9100 REM *******  OPEN FILE SUBROUTINE  *******
  137. 9110 CLOSE #1
  138. 9120 OPEN "R",#1,F$(A),L   
  139. 9140 PRINT " L(A) ";L   
  140. 9150 FIELD #1,L AS Y$    
  141. 9180 RETURN
  142. 9200 REM *******  OPEN FILE SUBROUTINE  *******
  143. 9210 CLOSE #2
  144. 9220 OPEN "R",#2,Q$,L
  145. 9250 FIELD #2,L AS Z1$
  146. 9280 RETURN
  147. 10000 REM *******  INITAL SELECTION  ********
  148. 10010 GOSUB 15000
  149. 10100 PRINT "**************  SORT FILE PROGRAM  **************"
  150. 10105 PRINT "FILE NUMBER = ";A;" FILE NAME = ";F$(A)
  151. 10110 PRINT ""
  152. 10120 FOR T = 1 TO NREC(A)
  153. 10130 PRINT T;"- ";FLDN$(A,T)
  154. 10140 NEXT T
  155. 10150 PRINT ""
  156. 10200 PRINT "***  WHICH FIELD IS THE PRIMARY SORT FIELD ?  ***"
  157. 10210 GOSUB 60000
  158. 10212 IF DT#<1 OR DT#>NREC(A) GOTO 10210
  159. 10213 IF FTY(1,DT#) <> 1 THEN GOTO 10210
  160. 10215 T3 = FD(1)
  161. 10218 FD(1) = DT#
  162. 10219 T3 = DT#
  163. 10220 GOTO 10275 
  164. 10230 PRINT "***********  WHICH FIELD IS THE SECONDARY FIELD ?  **********"
  165. 10232 PRINT "- If the primary values are equal"  
  166. 10234 PRINT "the record with the lowest secondary value will be stored first "
  167. 10240 GOSUB 60000
  168. 10242 IF DT#<1 OR DT#>NREC(A) GOTO 10240
  169. 10244 IF FTY(1,DT#) = 1 GOTO 10410
  170. 10246 FD(2) = DT#
  171. 10250 IF KTH= 2 GOTO 10275
  172. 10260 PRINT "************  WHICH FIELD IS THE THIRD FIELD  ? *************"
  173. 10262 PRINT "- If both the primary value and the secondary value are equal"
  174. 10264 PRINT "the record with the lowest third value will be stored first"
  175. 10270 GOSUB 60000
  176. 10272 IF DT#<1 OR DT#>NREC(A) GOTO 10270
  177. 10273 IF FTY(1,DT#) = 1 GOTO 10410
  178. 10274 FD(3) = DT#
  179. 10275 ON FTY(1,T3) GOSUB 10400,10600,10500,10500,10500
  180. 10280 RETURN
  181. 10400 REM ***DEFSTR X,P
  182. 10410 IF KTH> 1 THEN PRINT "********  STRING VARIABLES MAY ONLY BE SORTED BY ONE FIELD  ********"
  183. 10420 IF KTH> 1 GOTO 10100
  184. 10430 REM ***DIM X(4200),T(4200)
  185. 10490 RETURN
  186. 10500 REM *****DEFDBL X,P
  187. 10505 REM *****DIM X(4200),T(4200)
  188. 10510 RETURN
  189. 10600 IF KTH> 1 GOTO 10500
  190. 10610 REM ***DEFINT X,P
  191. 10620 REM ***DIM X(10000),T(10000)
  192. 10630 RETURN
  193. 11000 REM  *******  INTRODUCTION  ********
  194. 11100 GOSUB 15000
  195. 11110 PRINT "************************  SORT PROGRAM  *************************"
  196. 11120 PRINT ""
  197. 11130 PRINT "FILE NUMBER : ";A;" FILE NAME : ";F$(A)
  198. 11140 PRINT ""
  199. 11200 PRINT ""
  200. 11210 PRINT "Up to 10000 records may be sorted on ONE INTEGER FIELD "
  201. 11220 PRINT "Up to  4200 records may be sorted on ONE ALFANUMRIC FIELDS "
  202. 11230 PRINT "Up to  4200 records may be sorted on THREE DIFFERENT NUMERIC FIELDS"
  203. 11300 PRINT ""
  204. 11310 PRINT "The sort program reads the file on the default disk drive, sorts"
  205. 11320 PRINT "the records, then writes a sorted file with the same file name"
  206. 11330 PRINT "on a disk drive B. "
  207. 11940 PRINT ""
  208. 11950 PRINT "******************  PRESS ANY KEY TO CONTINUE  ******************"
  209. 11960 IF INKEY$ = "" GOTO 11960
  210. 11970 RETURN
  211. 12000 REM *****
  212. 12005 GOSUB 15000
  213. 12010 PRINT " PUT THE PROGRAM DATA DISK IN THE DEFAULT DISK DRIVE "
  214. 12020 PRINT ""
  215. 12030 PRINT "          PRESS ANY KEY TO CONTINUE "
  216. 12040 IF INKEY$ = "" GOTO 12040
  217. 12050 RETURN
  218. 13000 REM *****  
  219. 13100 GOSUB 15000
  220. 13110 PRINT "******************  SORT PROGRAM  *******************"
  221. 13120 PRINT ""
  222. 13130 PRINT "**********  WHICH FILE DO YOU WANT TO SORT  *********"
  223. 13140 FOR T = 1 TO MAXF
  224. 13150 PRINT T;" - ";F$(T)
  225. 13160 NEXT T
  226. 13170 PRINT "*****  ENTER THE FILE NUMBER THEN PRESS RETURN  ******"
  227. 13180 GOSUB 60000
  228. 13185 IF DT#<1 OR DT# >MAXF GOTO 13180
  229. 13190 A = DT#
  230. 13195 AHLD = A
  231. 13200 RETURN
  232. 14000 REM *****  SORT SELECTION
  233. 14100 GOSUB 15000
  234. 14110 PRINT "*******************  SORT PROGRAM  ********************"
  235. 14120 PRINT ""
  236. 14130 PRINT "DO YOU WANT TO SORT A FILE ON :"
  237. 14140 PRINT ""
  238. 14150 PRINT " 1. ONLY ONE INTEGER FIELD"
  239. 14160 PRINT ""
  240. 14170 PRINT " 2. ONE TO THREE NUMERIC FIELDS "
  241. 14180 PRINT ""
  242. 14190 PRINT " 3. A STRING FIELD"
  243. 14200 PRINT ""
  244. 14300 PRINT "*******  ENTER THE NUMBER THEN PRESS RETURN  ********"
  245. 14400 GOSUB 60000
  246. 14410 T = DT#
  247. 14420 ON T GOTO 14500,14700,14900
  248. 14500 REM 
  249. 14520 GOSUB  12000
  250. 14540 RUN "SORTINT"
  251. 14700 GOTO 10
  252. 14900 REM 
  253. 14920 GOSUB 12000
  254. 14940 RUN "SORTSTR"
  255. 15000 REM ******  CLEAR SCREEN 
  256. 15010 PRINT CHR$(26)
  257. 15020 RETURN
  258. 16000 REM ******  FIND MAX RECORD 
  259. 16100 MRN = LOF(1)/L(A)
  260. 16200 RETURN
  261. 26000 REM ******* ON ERROR ROUTINE ************
  262. 26200 PRINT "END OF FILE"
  263. 26205 MAXR = T - 1
  264. 26206 PRINT MAXR," MAX RECORD "
  265. 26210 GOTO 1200
  266. 30000 FOR T = 1 TO MAXR
  267. 31000 PRINT X(T)
  268. 32000 NEXT T
  269. 33000 RETURN
  270. 60000 REM *******  INTEGER LESS THEN 100 CHECK  ********
  271. 60010 MAX = 2
  272. 60020 ACT$ = "1234567890"
  273. 60030 PRINT ">__<";
  274. 60040 GOTO 60200
  275. 60050 REM *******  INTEGER *******                        
  276. 60060 MAX = 8
  277. 60070 ACT$ = "1234567890-+,"
  278. 60080 PRINT ">________<";
  279. 60090 GOTO 60200
  280. 60100 REM *******  SINGLE PRECISION  *******                        
  281. 60110 MAX = 10
  282. 60120 ACT$ = "1234567890+-,.%$"
  283. 60130 PRINT ">__________<";
  284. 60140 GOTO 60200
  285. 60150 REM ********* DOUBLE PRECISION
  286. 60160 MAX = 20
  287. 60170 ACT$ = "1234567890+-,.%$"
  288. 60180 PRINT ">____________________<";
  289. 60190 GOTO 60200
  290. 60200 REM ********** NUMBER CHECK **********
  291. 60210 A$ = ""
  292. 60220 K$(20) = " "
  293. 60230 KTMAX = 0
  294. 60240 FOR T9 = 1 TO MAX
  295. 60250 K$(T9) = " "
  296. 60260 NEXT T9
  297. 60270 DIG$ = "1234567890."
  298. 60280 DOTFLG = 0
  299. 60290 T2 = MAX + 1
  300. 60300 FOR T6 = 1 TO T2
  301. 60310 PRINT CHR$(8);
  302. 60320 NEXT T6
  303. 60330 IF INKEY$ = "" GOTO 60340 ELSE GOTO 60330
  304. 60340 KT = 0
  305. 60350 REM ***********  CHECK ALFANUMERIC INPUT FOR LENGTH  ***********
  306. 60360 KT = KT + 1
  307. 60370 REM     
  308. 60380 W$ = INKEY$
  309. 60390 IF W$ = "" GOTO 60380
  310. 60400 C = ASC(W$)
  311. 60410 IF C = 0 THEN GOSUB 61900
  312. 60420 IF C = 13 GOTO 60540
  313. 60430 IF C = 17 GOTO 61130
  314. 60440 IF C = 19 GOTO 60670
  315. 60450 IF C = 4 GOTO 60720
  316. 60460 IF C = 6 GOTO 60780
  317. 60470 IF C = 1 GOTO 60950
  318. 60480 IF KT > MAX GOTO 60370
  319. 60490 IF INSTR(ACT$,W$) = 0 GOTO 61210
  320. 60500 K$(KT) = W$
  321. 60510 PRINT K$(KT);
  322. 60520 IF KT > KTMAX THEN KTMAX = KT
  323. 60530 GOTO 60360
  324. 60540 REM **********  RETURN  **********
  325. 60550 FOR T9 = 1 TO KTMAX
  326. 60560 A$ = A$ + K$(T9)
  327. 60610 NEXT T9
  328. 60620 IF KTMAX = 0 THEN PRINT "1"
  329. 60630 IF KTMAX = 0 THEN DT# = 1
  330. 60640 IF KTMAX = 0 THEN RETURN
  331. 60650 PRINT ""
  332. 60660 GOTO 61240
  333. 60670 REM ********* MOVE CURSE BACK ********
  334. 60680 IF KT = 1 GOTO 60370
  335. 60690 KT = KT - 1
  336. 60700 PRINT CHR$(8);
  337. 60710 GOTO 60370
  338. 60720 REM ********* MOVE CURSER FORWARD *********
  339. 60730 IF KT >= MAX GOTO 60370
  340. 60740 IF KT > (KTMAX + 1) GOTO 60370
  341. 60750 PRINT K$(KT);
  342. 60760 KT = KT + 1
  343. 60770 GOTO 60370
  344. 60780 REM ********** INSERT ***********
  345. 60790 IF KT > KTMAX GOTO 60370
  346. 60800 W9 = MAX
  347. 60810 WHILE W9 > KT
  348. 60820 W9 = W9 - 1
  349. 60830 K$(W9 + 1) = K$(W9)
  350. 60840 WEND 
  351. 60850 K$(KT) = " "
  352. 60860 KTMAX = KTMAX + 1
  353. 60870 FOR T9 = KT TO KTMAX
  354. 60880 PRINT K$(T9);
  355. 60890 NEXT T9
  356. 60900 T6 = (KTMAX - KT) + 1
  357. 60910 FOR T7 = 1 TO T6
  358. 60920 PRINT CHR$(8);
  359. 60930 NEXT T7
  360. 60940 GOTO 60370
  361. 60950 REM ********** DELETE ***********
  362. 60960 IF KT > KTMAX GOTO 60370
  363. 60970 K$(MAX + 1) = ""
  364. 60980 W9 = KT 
  365. 60990 WHILE W9 <= MAX
  366. 61000 K$(W9) = K$(W9 + 1)
  367. 61010 W9 = W9 + 1
  368. 61020 WEND 
  369. 61030 KTMAX = KTMAX - 1
  370. 61040 FOR T9 = KT TO KTMAX
  371. 61050 PRINT K$(T9);
  372. 61060 NEXT T9
  373. 61070 PRINT "_";
  374. 61080 T7 = (KTMAX - KT) + 2
  375. 61090 FOR T8 = 1 TO T7
  376. 61100 PRINT CHR$(8);
  377. 61110 NEXT T8
  378. 61120 GOTO 60370
  379. 61130 REM ********* BACKSPACE ********
  380. 61140 IF KT = 1 GOTO 60370
  381. 61150 KT = KT - 1
  382. 61160 PRINT CHR$(8);
  383. 61170 K$(KT) = " " 
  384. 61180 PRINT "_";
  385. 61190 PRINT CHR$(8);
  386. 61200 GOTO 60370
  387. 61210 REM *******  INPUT NOT ACCEPTABLE  ********
  388. 61220 PRINT CHR$(7);
  389. 61230 GOTO 60380
  390. 61240 REM ********* CLEAR STRINGS ********
  391. 61250 MAX = LEN(A$)
  392. 61260 D2$ = ""
  393. 61270 D1$ = ""
  394. 61280 DFLG = 0
  395. 61290 FOR Q93 = 1 TO MAX
  396. 61300 R$ = MID$(A$,Q93,1)
  397. 61310 IF INSTR(DIG$,R$) = 0 GOTO 61380
  398. 61320 IF R$ = "." OR DFLG = 1 GOTO 61360
  399. 61330 IF DFLG = 1 GOTO 61360
  400. 61340 D2$ = D2$ + R$
  401. 61350 GOTO 61380
  402. 61360 D1$ = D1$ + R$
  403. 61370 DFLG = 1
  404. 61380 NEXT Q93
  405. 61390 DA# = VAL(D2$)
  406. 61400 D1# = VAL(D1$)
  407. 61410 DT# = DA# + D1#
  408. 61420 IF K$(1) = "-" THEN DT# =  -DT#   
  409. 61430 RETURN
  410. 61900 REM ****** CHECK FOR ASC0
  411. 61910 S4$ = INKEY$
  412. 61920 C2 =  ASC(S4$)
  413. 61930 IF C2 = 83 THEN C = 1
  414. 61940 IF C2 = 82 THEN C = 6
  415. 61950 IF C2 = 75 THEN C = 19
  416. 61960 IF C2 = 77 THEN C = 4 
  417. 61970 RETURN
  418. 64200 REM
  419. 64210 PRINT " ERROR NUMBER ";ERR ; " ON LINE ";ERL
  420. 64270 CLOSE 
  421. 64280 PRINT " PRESS ANY KEY TO CONTINUE"
  422. 64290 IF INKEY$ = "" THEN 64290
  423. 64300 RESUME 3 
  424. R ; " ON LINE ";ERL
  425. 64270 CLOSE 
  426. 64280 PRINT " PRESS